package logger

import (
	"ip_server/config"
	"fmt"
	"net"
	"os"
	"time"

	"github.com/sirupsen/logrus"
)

type Logger struct {
	*logrus.Logger
}

var (
	logger *Logger
)

type fieldKey string

// FieldMap allows customization of the key names for default fields.
type FieldMap map[fieldKey]string

func Init() {
	temp := NewLogger()
	logger = &Logger{temp}
	logger.SetReportCaller(true)
	logger.WithFields(logrus.Fields{
		"ip": "192.168.1.1",
	}).Info("This is a test log message")
}

func NewLogger() *logrus.Logger {
	// 创建日志文件目录
	filePath := "logs"
	if err := os.MkdirAll(filePath, os.ModePerm); err != nil {
		panic(err)
	}

	// 设置日志级别和输出格式
	log := logrus.New()
	//fmt.Println("=======================", config.GetConfig().MustInt("log", "console"))
	if config.GetConfig().MustInt("log", "console") == 1 {
		// 创建一个输出到控制台的钩子
		consoleHook := NewConsoleHook()
		log.AddHook(consoleHook)
	}

	log.SetFormatter(&logrus.JSONFormatter{
		TimestampFormat: "2006-01-02 15:04:05",
	})
	if config.GetConfig().MustValue("log", "level") == "Debug" {
		log.SetLevel(logrus.DebugLevel)
	}
	// 设置日志文件名和路径
	now := time.Now()
	fileName := fmt.Sprintf("%s/%s.log", filePath, now.Format("2006-01-02"))
	file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		panic(err)
	}
	log.SetOutput(file)

	// 添加定时器，每天定时创建新的日志文件
	go func() {
		for {
			now := time.Now()
			nextDay := now.AddDate(0, 0, 1)
			nextDay = time.Date(nextDay.Year(), nextDay.Month(), nextDay.Day(), 0, 0, 0, 0, nextDay.Location())
			t := time.NewTimer(nextDay.Sub(now))
			<-t.C
			fileName := fmt.Sprintf("%s/%s.log", filePath, nextDay.Format("2006-01-02"))
			file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
			if err != nil {
				panic(err)
			}
			log.SetOutput(file)
		}
	}()

	// return &Logger{log}
	return log
}

// func (l *Logger) WithFields(fields logrus.Fields) *logrus.Entry {
// 	// 添加链路调用信息
// 	fields["caller"] = l.CallerPrettyfier(func(f *runtime.Frame) (string, string) {
// 		return f.Function, fmt.Sprintf("%s:%d", filepath.Base(f.File), f.Line)
// 	})
// 	return l.Logger.WithFields(fields)
// }

func GetIP() {
	addrs, err := net.InterfaceAddrs()
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	for _, addr := range addrs {
		ip, _, err := net.ParseCIDR(addr.String())
		if err != nil {
			fmt.Println("Error:", err)
			continue
		}

		if ip.IsGlobalUnicast() {
			fmt.Println("IP地址：", ip)
		}
	}
}

// ConsoleHook 是一个输出到控制台的钩子
type ConsoleHook struct{}

// Levels 返回钩子支持的日志级别
func (hook *ConsoleHook) Levels() []logrus.Level {
	return logrus.AllLevels
}

// Fire 在日志事件发生时触发钩子
func (hook *ConsoleHook) Fire(entry *logrus.Entry) error {
	entry.Message = "[Console] " + entry.Message
	entry.Logger.Out = os.Stdout
	return nil
}

// NewConsoleHook 创建一个输出到控制台的钩子
func NewConsoleHook() *ConsoleHook {
	return &ConsoleHook{}
}
